/*
 * VistaCables.cpp
 *
 *  Created on: 25/11/2009
 *      Author: luis
 */

#include "VistaCables.h"

VistaCables::VistaCables(Circuito* circuito) {
	this->circuito = circuito;
}

void VistaCables::pintar_cable(int xo, int yo, int x, int y, Gtk::DrawingArea* area){
	Cairo::RefPtr<Cairo::Context> cr = area->get_window()->create_cairo_context();
	cr->set_source_rgb(1,0,0);
	cr->set_line_width(2);
	cr->move_to(xo, yo);
	cr->line_to(x, y);
	cr->stroke();
}

Cable* VistaCables::get_cable(float x, float y, int *inicio_x, int *inicio_y){
	Cable* retorno = NULL;
	unsigned int j;
	std::list<Cable*> lista_cable = circuito->get_lista_cables();
	std::list< Cable* >::iterator iterator;
	iterator = lista_cable.begin();
	std::list<PuntoQuiebre*> lista;
	std::list<PuntoQuiebre*>::iterator iterator_punto;
	int x_inicio;
	int y_inicio;
	int x_final;
	int y_final;
	unsigned int auxiliar = lista_cable.size();
	bool encontrado = false;
	for (j = 0; ((j< auxiliar)&&(!encontrado)); j++){
		lista = (*iterator)->get_lista();
		iterator_punto = lista.begin();
		*inicio_x = (*iterator_punto)->get_x();
		*inicio_y = (*iterator_punto)->get_y();
		while (iterator_punto!=lista.end()&&(!encontrado)){
			x_inicio = (*iterator_punto)->get_x();
			y_inicio = (*iterator_punto)->get_y();
			iterator_punto++;
			x_final = (*iterator_punto)->get_x();
			y_final = (*iterator_punto)->get_y();
			if ((x_inicio<= x)&&(x<= x_final)){
				float delta_x, delta_y;
				delta_x = x_final - x_inicio;
				delta_y = y_final - y_inicio;
				float m = delta_y/delta_x;
				/*
				 * Si coincide la posicion x, y con la de la linea trazada entre dos puntos de quiebre
				 * consecutivos detecta el cable
				 */
				if  ((((m*x + y_inicio - (m*x_inicio))-10)<= y)&&(y<=((m*x + y_inicio - (m*x_inicio))+10))){
					encontrado = true;
					retorno = (*iterator);
				}
			}
		}
		iterator++;
	}
	return retorno;
}

void VistaCables::repintar_cable_actual(Cable* cable, Gtk::DrawingArea* area){
	Cairo::RefPtr<Cairo::Context> cr = area->get_window()->create_cairo_context();
	std::list<PuntoQuiebre*> lista = cable->get_lista();
	std::list< PuntoQuiebre* >::iterator iterador;
	cr->set_source_rgb(1, 0, 0);
	cr->set_line_width(2);
	unsigned int i;
	int xo = INVALIDO;
	int yo = INVALIDO;
	iterador = lista.begin();
	//Repinto el cable actual recorriendo la lista de quiebres
	for (i = 0; i < lista.size(); i++){
		if ((xo!=INVALIDO)&&(yo!=INVALIDO)){
			cr->move_to(xo, yo);
			cr->line_to((*iterador)->get_x(), (*iterador)->get_y());
			cr->stroke();
		}
		xo = (*iterador)->get_x();
		yo = (*iterador)->get_y();
		iterador++;
	}
}

void VistaCables::pintar_cable_en_contexto(Cairo::RefPtr<Cairo::Context> cr){
	std::list<Cable*> lista_cables = circuito->get_lista_cables();
	std::list< Cable* >::iterator it;
	it = lista_cables.begin();
	std::list<PuntoQuiebre*> lista;
	unsigned int j;
	std::list< PuntoQuiebre* >::iterator iterador;
	cr->set_source_rgb(1, 0, 0);
	cr->set_line_width(2);
	unsigned int i;
	int xo = INVALIDO;
	int yo = INVALIDO;
	/*
	 * Recorro por cada cable, su lista de puntos de quiebre y asi voy pintando
	 */
	for (j = 0; j < lista_cables.size(); j++){
		lista = (*it)->get_lista();
		iterador = lista.begin();
		for (i = 0; i < lista.size(); i++){
			if ((xo!=INVALIDO)&&(yo!=INVALIDO)){
				cr->move_to(xo, yo);
				cr->line_to((*iterador)->get_x(), (*iterador)->get_y());
				cr->stroke();
			}
			xo = (*iterador)->get_x();
			yo = (*iterador)->get_y();
			iterador++;
		}
		it++;
		xo = INVALIDO;
		yo = INVALIDO;
	}
}

VistaCables::~VistaCables() {

}
